/*
 * Copyright (c) 2021，上海福宇龙汽车科技有限公司
 * All rights reserved.
 * 文件名称: app_ehbl_uart.h
 * 摘要:
 * 当前版本: V1.0.0 Chenjianbo
 * Date: 2024-01-29
 * 历史版本: Vx.x.x，编写者/修改者，修改时间，修改内容（重大发布时，总结重点变更内容）
 */
#ifndef _APP_EHBL_UART_H
#define _APP_EHBL_UART_H

#include "stdint.h"

/*串口帧起始大小端问题所以定义为FE68*/
#define UART_FRAME_START (0xFE68u)
/*串口4填充0x00*/
#define UART_FILL (0x00u)
/*串口帧结束*/
#define UART_FRAME_END (0xFCu)
/*接收串口报文长度*/
#define UART_RECV_LENGTH (0x11u)

/**
 * ehbl锁串口协议
 *
 */
typedef union
{
    uint8_t data[17];
    struct
    {
        uint16_t start;
        uint8_t len;
        uint8_t single;
        uint16_t cmd;
        uint8_t err;
        uint8_t res;
        uint8_t pdata[4];
        uint32_t crc;
        uint8_t end;
    } sig;
} uart_transmit_un;

/*串口接收数据信息*/
typedef struct
{
    uint8_t data[UART_RECV_LENGTH];
    uint8_t recv_len;
    uint8_t allow_recv_flag;
    uint8_t recv_complete;
    uint8_t Processing_data;/*处理数据是否完成标志0未完成 1完成*/
} uart_recv_sta_st;

/*
 * 函数介绍: 串口4协议初始化
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Uart4_init(void);

/*
 * 函数介绍:接收串口发送过来的数据
 * 参数:
 *          recv_data：串口发送过来的数据
 * 返回值: {*}
 * 备注:放到串口接收回调中调用
 */
void app_uart_get_recvdata(uint8_t *recv_data, uint16_t len);

/*
 * 函数介绍:应用串口主入口
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void app_uart_main(void);

/*
 * 函数介绍: 串口4发送函数
 * 参数:
 * 返回值: {*}
 * 备注:
 */
void Uart4_send(uint16_t cmd, uint32_t pdata);


/**
 * 反转数组元素的顺序
 * 
 * 该函数用于将一个给定数组的元素顺序进行反转。
 * 
 * @param array 指向需要被反转的数组的指针。
 * @param size 数组的大小。
 * 
 * @note 该函数不适用于空数组或只包含一个元素的数组。
 */
void reverse_array(uint8_t *array, size_t size);
#endif

